【Codewars每日一题】- Sum of Numbers

题目

题目地址

Given two integers a and b, which can be positive or negative, find the sum of all the numbers between including them too and return it. If the two numbers are equal return a or b.

Note: a and b are not ordered!

Examples

1
2
3
4
5
6
get_sum(1, 0) == 1   // 1 + 0 = 1
get_sum(1, 2) == 3 // 1 + 2 = 3
get_sum(0, 1) == 1 // 0 + 1 = 1
get_sum(1, 1) == 1 // 1 Since both are same
get_sum(-1, 0) == -1 // -1 + 0 = -1
get_sum(-1, 2) == 2 // -1 + 0 + 1 + 2 = 2

答案

我的答案

1
2
3
4
5
6
7
8
9
10
11
12
def get_sum(a,b):
sum = 0
#good luck!
if a == b:
return a
elif a < b:
for n in range(a, b+1):
sum += n
else:
for n in range(b, a+1):
sum += n
return sum

最佳答案

1
2
def get_sum(a,b):
return sum(xrange(min(a,b), max(a,b)+1))

明显地,我的答案比较直接,没有考虑使用较为“高级”的方法。

知识点

sum

sum()方法对系列进行求和计算。

语法

sum(iterable[, start])

  • iterable – 可迭代对象,如列表。
  • start – 指定相加的参数,如果没有设置这个值,默认为0。

示例

1
2
3
4
5
6
>>> sum([0,1,2])
3
>>> sum([0,1,2],1)
4
>>> sum([0,1,2],2)
5

range和xrange

在最佳答案中还有另外一种:

1
2
def get_sum(a,b):
return sum(range(min(a, b), max(a, b) + 1))

与之前的区别在于这里使用了range()函数

xrange() 函数用法与 range 完全相同,所不同的是生成的不是一个数组,而是一个生成器。

语法

range(start, stop[, step])

  • start: 计数从 start 开始。默认是从 0 开始。例如range(5)等价于range(0, 5);
  • end: 计数到 end 结束,但不包括 end。例如:range(0, 5) 是[0, 1, 2, 3, 4]没有5
  • step:步长,默认为1。例如:range(0, 5) 等价于 range(0, 5, 1)

示例

xrange()range()这两个基本上都是在循环的时候用。

1
2
3
4
5
for i in range(0, 100):
print i

for i in xrange(0, 100):
print i

这两个输出的结果都是一样的,实际上有很多不同,range会直接生成一个list对象:

1
2
3
4
5
6
7
8
9
10
>>> a = range(0,10)
>>> print type(a)
<type 'list'>
>>> print a
[0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
>>> print a[0], a[1]
0 1
>>> a = range(0, 10, 2)
>>> print a
[0, 2, 4, 6, 8]

而xrange则不会直接生成一个list,而是每次调用返回其中的一个值

1
2
3
4
5
6
7
>>> a = xrange(0,10)
>>> print type(a)
<type 'xrange'>
>>> print a
xrange(10)
>>> print a[0], a[1]
0 1

所以xrange做循环的性能比range好,尤其是返回很大的时候!尽量用xrange吧,除非你是要返回一个列表。

注意点

前提是你使用的是Python2,因为在Python3range()是像xrange()那样实现以至于一个专门的xrange()函数都不再存在,xrange()会抛出命名异常。

1
2
3
4
>>> a = xrange(0,10)
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
NameError: name 'xrange' is not defined

另外,在Python3中,range()函数也不再返回一个list。

1
2
3
4
5
>>> a = range(0, 10)
>>> print(type(a))
<class 'range'>
>>> print(type(a))
<class 'range'>

hoxis wechat
一个脱离了高级趣味的程序员,关注回复1024有惊喜~
赞赏一杯咖啡
0%